/**
 * 
 arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
 callback
执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数，包含四个参数：
accumulator
累计器累计回调的返回值; 它是上一次调用回调时返回的累积值，或initialValue（见于下方）。
currentValue
数组中正在处理的元素。
index 可选
数组中正在处理的当前元素的索引。 
如果提供了initialValue，则起始索引号为0，否则从索引1起始。
array可选
调用reduce()的数组
initialValue可选
作为第一次调用 callback函数时的第一个参数的值。 
如果没有提供初始值，则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
 */
Array.prototype.myreduce=function(callback,initialValue){
    if((typeof callback!=='function')||!this.length||!Array.isArray(this)){
        throw new TypeError;
    }
    //判断是否有初始值
    const hasIniValue=initialValue!==undefined;
    //第一个累加器的值
    let value=hasIniValue?initialValue:this[0];
    let O=Object(this)
    let len=this.length>>>0;
    for(let i=hasIniValue?0:1;i<len;i++){
        value=callback(value,O[i],i,this);
    }
    return value;
}
const arr=[1,2,3,4,5];
let res=arr.myreduce((pre,cur)=>{
    return pre+cur;
})
console.log("res",res);
